class Observer{
	constructor(data) {
	    this.walk(data)
	}
	
	
	walk (data) {
		// 判断data是否是对象
		if(!data || typeof data !== 'object') return
		// 遍历data所以对象
		Object.keys(data).forEach(key => {
			this.defindReactive(data,key,data[key])
		})
	}
	
	defindReactive (obj,key,val) {
		// 负责收集依赖 发送通知
		let dep = new Dep()
		// 将对象val内部数据转化为响应式数据
		this.walk(val) // 调用walk判断val是否为对象 
		let _this = this
		Object.defineProperty(obj,key,{
			enumberable:true, // 是否可遍历
			configurable:true, // 是否可枚举
			get (){ // 访问数据
				// 收集依赖
				Dep.target && dep.addsub(Dep.target)
				return val // 调用val避免死循环
			},
			set (newValue) {
				if (val === newValue) return
				val = newValue
				_this.walk(newValue) // 重新赋值后 判断是否为对象 若为对象 将对象内部转化为响应式
				dep.notify()
			}
		})
	}
	
}